package com.innerchic.mapper.file;

import com.innerchic.mapper.log.Logger;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * ================================================
 * 作    者：贾恒飞 >>> 17515250730@163.com
 * 项    目：young
 * 日    期：2021/11/4 10:50
 * 包    名：com.innerchic.mapper.file
 * 描    述：快速的文件写入
 * Create by zFox from AndroidStudio4.2
 * ================================================
 */
public class FastFileWriter {

    /**
     * 复制文件
     *
     * @param sourcePath 源文件地址
     * @param destPath   目标文件地址
     */
    public static void copyFile(String sourcePath, String destPath) {
        copyFile(new File(sourcePath), new File(destPath));
    }

    /**
     * 复制文件
     *
     * @param source   源文件
     * @param destPath 目标文件地址
     */
    public static void copyFile(File source, String destPath) {
        copyFile(source, new File(destPath));
    }

    /**
     * 复制文件
     *
     * @param source 源文件
     * @param dest   目标地址
     */
    public static void copyFile(File source, File dest) {
        if (source == null || !source.exists()) {
            Logger.d("copyFile()复制文件时源文件不存在");
            return;
        }
        //初始化一下目标地文件
        auditFile(dest.getPath());
        FileChannel inputChannel = null;
        FileChannel outputChannel = null;
        try {
            inputChannel = new FileInputStream(source).getChannel();
            outputChannel = new FileOutputStream(dest).getChannel();
            outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputChannel != null) inputChannel.close();
                if (outputChannel != null) outputChannel.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 写入到文件中
     *
     * @param filePath 文件路径
     * @param fw       写入的字节数组
     * @param append   是否追加,true追加,false覆盖
     */
    public static void write(String filePath, byte[] fw, boolean append) {
        //先检查文件以及文件层级是否存在
        auditFile(filePath);

        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream(filePath, append);
            fout.write(fw);
            fout.flush();
        } catch (IOException e) {
            e.printStackTrace();
            Logger.d("write()文件写入失败");
        } finally {
            if (fout != null) {
                try {
                    fout.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 写入到文件中
     */
    public static void write(String path, String fw, boolean append) {
        write(path, fw.getBytes(), append);
    }

    /**
     * 检查文件是否存在,如果不存在就创建文件和他的目录层级
     *
     * @param filePath 文件路径
     */
    public static void auditFile(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            File parentFile = file.getParentFile();
            if (!parentFile.exists()) {
                boolean mkdirs = parentFile.mkdirs();
            }
            try {
                boolean newFile = file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
